package jp.co.nes.awssupport.access.utility;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang3.StringUtils;

import jp.co.nes.awssupport.common.base.CommonException;
import jp.co.nes.awssupport.common.constant.CreditCouponHistoryKind;

/**
 * ID採番ユーティリティです。
 */
public class IdUtil {

    /**
     * デフォルトコンストラクタです。<br>
     * 本クラスはインスタンスを生成しません。
     */
    private IdUtil() {
    }

    /**
     * UUIDを生成します。
     *
     * @return UUID
     */
    public static String createUuid() {
        return UUID.randomUUID().toString();
    }

    /**
     * リソースIDキーを生成します。
     *
     * @param resourceId リソースID
     * @return リソースIDキー
     */
    public static String createResourceIdKey(String resourceId) {
        String resourceIdKey = "ResourceIdNullOrEmptyData";
        if (!StringUtils.isEmpty(resourceId)) {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
                byte[] byteValue = messageDigest.digest(resourceId.getBytes());
                resourceIdKey = Hex.encodeHexString(byteValue);
            } catch (NoSuchAlgorithmException e) {
                throw new CommonException(e);
            }
        }
        return resourceIdKey;
    }

    /**
     * クレジット履歴のExIdを生成します。
     *
     * @param creditCouponId クレジットID
     * @param yearMonthValue クレジット履歴年月
     * @param creditCouponHistoryKind クレジット履歴種別
     * @return クレジット履歴のExId
     */
    public static String createCreditCouponHistoryExId(String creditCouponId, String yearMonthValue,
            CreditCouponHistoryKind creditCouponHistoryKind) {
        if (creditCouponHistoryKind == null || creditCouponHistoryKind == CreditCouponHistoryKind.ADD) {
            throw new CommonException("creditCouponHistoryKind is wrong(creditCouponHistoryKind="
                    + creditCouponHistoryKind + ")");
        }
        return creditCouponId + ":" + yearMonthValue + ":" + creditCouponHistoryKind.getCreditCouponHistoryExIdSuffix();
    }

    /**
     * 利用実績のExIdを生成します。
     *
     * @param linkedAccountId 連結アカウントID
     * @param yearMonthValue 年月
     * @return 利用実績のExId
     */
    public static String createUsageHistoryExId(String linkedAccountId, String yearMonthValue) {
        return yearMonthValue + ":" + linkedAccountId;
    }
}
